<?php
//$teste = setlocale(LC_ALL, "ptb_bra");

include_once 'abstract_dao.php';
include_once 'model_usuario.php';

/**
 * Data Access Object para as transacoes relacionadas a USUARIOS.
 */
class dao_usuario extends abstract_dao{

    private $key_word = "batata";
    
    public function insert(model_usuario $model){
        $sql = "INSERT INTO `usuario`(`USU_NOME`, `USU_PERFIL`, `USU_STATUS`, `USU_SENHA`) VALUES ( ?, ?, ?, AES_ENCRYPT(?, ?))";
        
        $stmt = $this->pdo->prepare($sql);
        $sucesso = $stmt->execute(array($model->USU_NOME, $model->USU_PERFIL, $model->USU_STATUS, $model->USU_SENHA, $this->key_word));
        
        if($sucesso){
            return $this->pdo->lastInsertId();
        }else{
            throw new DAOException("Erro ao inserir usuario");
        }
    }

    /**
     * Atualiza a senha dos usuarios
     * @param type $model Modelo de 
     * @return boolean TRUE em caso de sucesso
     */
    public function updateUSU_SENHA($model){
        $sql = "UPDATE `usuario` set USU_SENHA = AES_ENCRYPT(?, ?) WHERE USU_ID = ?";
        
        $stmt = $this->pdo->prepare($sql);
        
//        $stmt->bind_param("ssi", $model->USU_SENHA, $this->key_word, $model->USU_ID);
        
        if ($stmt->execute(array($model->USU_SENHA, $this->key_word, $model->USU_ID))){
            if($stmt->rowCount() == 1){
                $retorno = true;
            }
        }else{
            throw new DAOException("Erro ao atualizar senha");
        }
        
        return $retorno;
    }

    /**
     * Atualiza o status do usuario
     * @param type $model Modelo de 
     * @return boolean TRUE em caso de sucesso
     */
    public function updateUSU_STATUS(model_usuario $model){
        $sql = "UPDATE `usuario` set USU_STATUS = ? WHERE USU_ID = ?";
        
        $stmt = $this->pdo->prepare($sql);
        
//        $stmt->bind_param("ss", $model->USU_STATUS, $model->USU_ID);
        
        if ($stmt->execute(array($model->USU_STATUS, $model->USU_ID))){
            if($stmt->rowCount() == 1){
                $retorno = true;
            }
        }else{
            throw new DAOException("Erro ao atualizar USU_STATUS");
        }
        
        return $retorno;
    }
    
    public function select($id){
        $sql_select = "SELECT * FROM `usuario` WHERE `USU_ID` LIKE ?";
        
        $stmt = $this->pdo->prepare($sql_select);
        
        if ($stmt->execute(array($id))){
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno = new model_usuario();
                $retorno->populateFromBanco($row);
            }
        }else{
            throw new DAOException("Erro ao selecionar o usuario");
        }
        return $retorno;
    }
    
    /**
     * Recupera os dados do usuario atraves do codigo do cliente
     * @param type $CLI_ID Codigo do cliente
     * @return model_usuario Retorna um model_usuario
     */
    public function selectByCLI_ID($CLI_ID){
        $sql_select = "SELECT U.USU_ID, U.USU_NOME, U.USU_STATUS FROM `usuario` AS U INNER JOIN `cliente` AS C ON U.USU_ID = C.USU_ID WHERE C.CLI_ID = ?";
        
        $stmt = $this->pdo->prepare($sql_select);
        
        if ($stmt->execute(array($CLI_ID))){
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno = new model_usuario();
                $retorno->populateFromBanco($row);
            }
        }else{
            throw new DAOException("Erro ao selecionar o usuario pelo id do cliente");
        }
        return $retorno;
    }
    
    public function checaCadastro($valor){
        $sql = "SELECT USU_NOME FROM usuario WHERE USU_NOME LIKE ?";
        $stmt = $this->pdo->prepare($sql);
        
        if($stmt->execute(array($valor))){
            $num_rows = $stmt->rowCount();
        }
        
        return $num_rows;
    }
    
    /**
     * Valida o usuario e senha no banco de dados
     * 
     * @param string $usuario
     * @param string $senha
     * @return model_usuario
     */
    public function login($usuario, $senha){
        $keyword = "batata";
        
        $sql = "SELECT USU_ID, USU_PERFIL, USU_NOME, USU_STATUS, USU_DATA_PRIMEIRO_ACESSO, USU_DATA_ULTIMO_ACESSO, USU_DATA_BLOQUEIO, USU_DATA_ATIVACAO, USU_DATA_CANCELAMENTO FROM usuario where USU_NOME like ? and USU_SENHA like AES_ENCRYPT(?,?)";
       
        $stmt = $this->pdo->prepare($sql);

        if ($stmt->execute(array($usuario, $senha, $keyword))){
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno = new model_usuario();
                $retorno->populateFromBanco($row);
            }
        }else{
            throw new DAOException("Erro ao gerar ao consultar o usuario");
        }

        return $retorno;
    }
    
    /**
     * Verifica se este e o primeiro aceso do usuario.<br>
     * Se sim cadastra no banco de dados a data atual como a data do primeiro acesso e retorna true.<br>
     * Se nao retorna false.
     * @param integer $id Id do usario a ser testado
     * @return boolean TRUE caso seja o primeiro acesso e FALSE em caso negativo.
     */
    public function isPrimeiroAcesso($id){
        $sql_select = "SELECT USU_DATA_PRIMEIRO_ACESSO FROM usuario WHERE USU_ID = ?";
        $sql_update = "UPDATE usuario SET USU_DATA_PRIMEIRO_ACESSO = CURDATE() WHERE USU_ID = ?";
        
        $stmt_select = $this->pdo->prepare($sql_select);
        
        if($stmt_select->execute(array($id))){
            $linha = $stmt_select->fetch(PDO::FETCH_ASSOC);
            if ($linha["USU_DATA_PRIMEIRO_ACESSO"] != null){
                return FALSE;
            }else{
                $stmt_update = $this->pdo->prepare($sql_update);
                if ($stmt_update->execute(array($id))){
                    return TRUE;
                }
            }
        }
        throw new DAOException("Erro em validar o primeiro acesso");
    }
    
    /**
     * Seta a data atual como a data do ultimo acesso.
     * @param integer $id Id do usario a ser atualizado
     * @return boolean TRUE em caso de sucesso.
     */
    public function setUltimoAcesso($id){
        $sql_update = "UPDATE usuario SET USU_DATA_ULTIMO_ACESSO = CURDATE() WHERE USU_ID = ?";
        
        $stmt = $this->pdo->prepare($sql_update);
        if($stmt->execute(array($id))){
            return true;
        }
        throw new DAOException("Erro em setar a data do ultimo acesso");
    }

}

?>
